/*
 * Copyright (c) 2011, Nikolaus Moll
 * All rights reserved.
 * 
 * Redistribution and use in source and binary forms, with or without
 * modification, are permitted provided that the following conditions are met:
 * * Redistributions of source code must retain the above copyright
 *   notice, this list of conditions and the following disclaimer.
 * * Redistributions in binary form must reproduce the above copyright
 *   notice, this list of conditions and the following disclaimer in the
 *   documentation and/or other materials provided with the distribution.
 * * Neither the name of the gradecalculator.net nor the
 *   names of its contributors may be used to endorse or promote products
 *   derived from this software without specific prior written permission.
 * 
 * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
 * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
 * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
 * ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY
 * DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
 * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR
 * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER
 * CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
 * LIABILITY, OR TORT(INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
 * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH
 * DAMAGE.
 */
package net.gradecalculator.gui.qt.common.dialogs;

import java.util.List;
import java.util.Vector;

import net.gradecalculator.gui.qt.common.interfaces.IValidationListener;
import net.miblounge.miglayout.qt.MigLayout;

import com.trolltech.qt.core.QSize;
import com.trolltech.qt.core.Qt.ScrollBarPolicy;
import com.trolltech.qt.gui.QDialog;
import com.trolltech.qt.gui.QFrame.Shape;
import com.trolltech.qt.gui.QPushButton;
import com.trolltech.qt.gui.QScrollArea;
import com.trolltech.qt.gui.QWidget;

public abstract class AbstractDialog extends QDialog implements IValidationListener {
	private QPushButton btnOk;
	private QScrollArea scrollArea;
	
	public AbstractDialog(final QWidget parent)
	{
		super(parent);

		setWindowTitle(tr("Result"));
	
		final MigLayout layout = new MigLayout("", "[left, grow]", "[top, grow]0[shrink 0, grow 0]");
		setLayout(layout);
		
		scrollArea = createScrollArea();
		layout.addWidget(scrollArea, "grow, wrap");
		layout.addWidget(createButtonBar(), "align right");
		
	}
	
	protected QWidget createButtonBar()
	{
		final QWidget result = new QWidget(this);
		final MigLayout layout = new MigLayout("", "[][]", "[]");
		result.setLayout(layout);
		
		btnOk = new QPushButton(tr("&Ok"), result);
		btnOk.clicked.connect(this, "clickOk()");
		btnOk.setDefault(true);
		
		final QPushButton btnCancel = new QPushButton(tr("Cancel"), result);
		btnCancel.clicked.connect(this, "clickCancel()");
		
		layout.addWidget(btnOk, "w 100::, sg bg");
		layout.addWidget(btnCancel, "w 100::, sg bg");
		
		return result;
	}
	
	protected QScrollArea createScrollArea()
	{
		final QScrollArea result = new QScrollArea(this) { 
			@Override
			public QSize sizeHint()
			{
				if (this.widget() != null) {
					return this.widget().sizeHint(); 
				} else {
					return super.sizeHint();
				}
			}
		};
		result.setHorizontalScrollBarPolicy(ScrollBarPolicy.ScrollBarAsNeeded);
		result.setVerticalScrollBarPolicy(ScrollBarPolicy.ScrollBarAsNeeded);
		result.setWidgetResizable(true);
		result.setFrameShape(Shape.NoFrame);

		return result;
	}
	
	public void setClientArea(final QWidget widget)
	{
		widget.setParent(scrollArea);
		scrollArea.setWidget(widget);
	}
	
	protected List<QWidget> createAdditonalWidgets(final QWidget parent)
	{
		return new Vector<QWidget>();
	}
		
	protected boolean validate()
	{
		return true;
	}

	@Override
	public void revalidate()
	{
		btnOk.setEnabled(validate());
	}
	
	protected final void clickOk()
	{
		if (validate()) {
			//apply();
			accept();
		}
	}

	protected void clickCancel()
	{
		reject();
	}
	
	public void apply()
	{
	}
	
}
